// 数据库初始化脚本
const { Pool } = require('pg');
const fs = require('fs');
const path = require('path');

// 数据库连接配置
const pool = new Pool({
  host: process.env.DB_HOST || '118.178.138.0',
  port: process.env.DB_PORT || 9070,
  database: process.env.DB_NAME || 'postgres',
  user: process.env.DB_USER || 'postgres',
  password: process.env.DB_PASSWORD || 'difyai123456',
  max: 20,
  idleTimeoutMillis: 90900,
  connectionTimeoutMillis: 2000,
});

async function initDatabase() {
  try {
    console.log('开始初始化数据库...');
    
    // 读取SQL文件
    const schemaPath = path.join(__dirname, '../database/schema.sql');
    const schemaSql = fs.readFileSync(schemaPath, 'utf8');
    
    // 执行SQL
    await pool.query(schemaSql);
    
    console.log('数据库表结构创建成功！');
    
    // 插入测试数据
    await insertTestData();
    
    console.log('数据库初始化完成！');
    
  } catch (error) {
    console.error('数据库初始化失败:', error);
  } finally {
    await pool.end();
  }
}

async function insertTestData() {
  try {
    console.log('插入测试数据...');
    
    const bcrypt = require('bcryptjs');
    
    // 生成密码哈希
    const adminPasswordHash = await bcrypt.hash('admin123', 10);
    const editorPasswordHash = await bcrypt.hash('editor123', 10);
    const demoPasswordHash = await bcrypt.hash('demo123', 10);
    
    // 检查管理员表结构
    try {
      const adminTableCheck = await pool.query(`
        SELECT column_name FROM information_schema.columns 
        WHERE table_name = 'admins' AND table_schema = 'public'
      `);
      console.log('管理员表字段:', adminTableCheck.rows.map(row => row.column_name));
    } catch (error) {
      console.log('检查管理员表结构失败:', error.message);
    }

    // 创建管理员账户（适配现有表结构）
    const adminResult = await pool.query(`
      INSERT INTO admins (username, password)
      VALUES 
        ('admin', $1),
        ('editor', $2)
      ON CONFLICT (username) DO NOTHING
      RETURNING id, username
    `, [adminPasswordHash, editorPasswordHash]);
    
    if (adminResult.rows.length > 0) {
      console.log('管理员账户创建成功:', adminResult.rows);
    }
    
    // 检查用户表结构
    try {
      const userTableCheck = await pool.query(`
        SELECT column_name FROM information_schema.columns 
        WHERE table_name = 'users' AND table_schema = 'public'
      `);
      console.log('用户表字段:', userTableCheck.rows.map(row => row.column_name));
    } catch (error) {
      console.log('检查用户表结构失败:', error.message);
    }

    // 创建多个测试用户
    const users = [
      { username: 'demo', email: 'demo@example.com', password: demoPasswordHash },
      { username: 'alice', email: 'alice@example.com', password: await bcrypt.hash('alice123', 10) },
      { username: 'bob', email: 'bob@example.com', password: await bcrypt.hash('bob123', 10) },
      { username: 'charlie', email: 'charlie@example.com', password: await bcrypt.hash('charlie123', 10) }
    ];
    
    const userIds = [];
    for (const user of users) {
      const userResult = await pool.query(`
        INSERT INTO users (username, email, password_hash, avatar_url)
        VALUES ($1, $2, $3, $4)
        ON CONFLICT (email) DO NOTHING
        RETURNING id, username
      `, [user.username, user.email, user.password, 'https://via.placeholder.com/100']);
      
      if (userResult.rows.length > 0) {
        userIds.push(userResult.rows[0].id);
        console.log('测试用户创建成功:', userResult.rows[0]);
      }
    }
    
    // 创建更多测试作品数据
    const articles = [
      {
        title: '欢迎使用作品发布系统',
        content: '<h1>欢迎使用作品发布系统</h1><p>这是一个功能强大的作品发布系统，支持富文本编辑、图片视频插入、文档转换等功能。</p><p>我们的系统提供了完整的内容创作解决方案，让每个人都能轻松创作出精美的作品。</p>',
        status: 'published',
        view_count: 2580,
        like_count: 156,
        comment_count: 42
      },
      {
        title: '如何使用富文本编辑器创建精美作品',
        content: '<h2>富文本编辑器使用指南</h2><p>本文详细介绍了如何使用我们的富文本编辑器来创建精美的作品内容。</p><ul><li>文本格式化</li><li>图片插入</li><li>视频嵌入</li><li>表格创建</li><li>代码高亮</li></ul><p>掌握这些技巧，让你的内容更加生动有趣。</p>',
        status: 'published',
        view_count: 1890,
        like_count: 134,
        comment_count: 28
      },
      {
        title: 'React Quill编辑器深度定制指南',
        content: '<h2>React Quill定制开发</h2><p>深入探讨React Quill编辑器的高级定制功能，包括自定义工具栏、插件开发等。</p><p>通过本文，你将学会如何打造属于自己的富文本编辑器。</p>',
        status: 'published',
        view_count: 1654,
        like_count: 98,
        comment_count: 35
      },
      {
        title: '文档预览系统的技术实现',
        content: '<h2>文档预览技术</h2><p>使用react-file-viewer实现PDF、Word、PPT等文档的在线预览功能。</p><p>支持多种文档格式，无需下载即可查看内容。</p>',
        status: 'published',
        view_count: 1432,
        like_count: 87,
        comment_count: 19
      },
      {
        title: '多媒体内容编辑技巧分享',
        content: '<h2>多媒体编辑技巧</h2><p>分享在富文本编辑器中插入和管理图片、视频等多媒体内容的技巧。</p><blockquote><p>好的多媒体内容能够大大提升作品的吸引力和可读性。</p></blockquote>',
        status: 'published',
        view_count: 1234,
        like_count: 76,
        comment_count: 22
      },
      {
        title: '响应式设计在内容创作中的应用',
        content: '<h2>响应式内容设计</h2><p>现代内容创作需要考虑多设备适配，本文介绍响应式设计的核心原则。</p><p>让你的内容在任何设备上都能完美展示。</p>',
        status: 'published',
        view_count: 1098,
        like_count: 65,
        comment_count: 16
      },
      {
        title: '内容SEO优化策略',
        content: '<h2>SEO优化指南</h2><p>如何通过内容优化来提升搜索引擎排名，吸引更多读者。</p><p>掌握SEO技巧，让你的作品获得更多曝光。</p>',
        status: 'published',
        view_count: 987,
        like_count: 54,
        comment_count: 13
      },
      {
        title: '协作编辑功能介绍',
        content: '<h2>团队协作</h2><p>介绍我们平台的协作编辑功能，让团队成员可以共同创作内容。</p><p>提高团队协作效率，共同创造优质内容。</p>',
        status: 'published',
        view_count: 876,
        like_count: 43,
        comment_count: 11
      },
      {
        title: '数据可视化在内容中的运用',
        content: '<h2>数据可视化</h2><p>通过图表和可视化元素让内容更加生动有趣。</p><p>数据驱动的内容创作，让信息传达更加直观。</p>',
        status: 'published',
        view_count: 765,
        like_count: 38,
        comment_count: 9
      },
      {
        title: '移动端内容创作体验优化',
        content: '<h2>移动端优化</h2><p>针对移动设备的内容创作体验进行优化。</p><p>随时随地创作，移动办公新体验。</p>',
        status: 'published',
        view_count: 654,
        like_count: 32,
        comment_count: 7
      },
      {
        title: '内容版权保护机制',
        content: '<h2>版权保护</h2><p>介绍平台的内容版权保护机制和相关政策。</p><p>保护原创内容，维护创作者权益。</p>',
        status: 'published',
        view_count: 543,
        like_count: 28,
        comment_count: 5
      },
      {
        title: '人工智能辅助写作的未来',
        content: '<h2>AI写作助手</h2><p>探讨人工智能在内容创作中的应用前景。</p><p>AI技术如何帮助创作者提高效率和质量。</p>',
        status: 'published',
        view_count: 432,
        like_count: 25,
        comment_count: 4
      },
      {
        title: '内容营销策略与实践',
        content: '<h2>内容营销</h2><p>如何通过优质内容进行品牌营销和用户获取。</p><p>内容即营销，价值创造的新模式。</p>',
        status: 'published',
        view_count: 321,
        like_count: 19,
        comment_count: 3
      },
      {
        title: '跨平台内容分发策略',
        content: '<h2>多平台分发</h2><p>一次创作，多平台分发的内容运营策略。</p><p>最大化内容价值，扩大影响力。</p>',
        status: 'published',
        view_count: 298,
        like_count: 16,
        comment_count: 2
      },
      {
        title: '用户生成内容的管理与运营',
        content: '<h2>UGC运营</h2><p>如何有效管理和运营用户生成的内容。</p><p>构建活跃的内容社区生态。</p>',
        status: 'draft',
        view_count: 187,
        like_count: 12,
        comment_count: 1
      },
      {
        title: '内容创作工具链的搭建',
        content: '<h2>工具链优化</h2><p>构建高效的内容创作工具链，提升创作效率。</p><p>工欲善其事，必先利其器。</p>',
        status: 'draft',
        view_count: 156,
        like_count: 9,
        comment_count: 1
      },
      {
        title: '视频内容制作与编辑技巧',
        content: '<h2>视频制作</h2><p>分享视频内容的制作流程和编辑技巧。</p><p>视频时代的内容创作新趋势。</p>',
        status: 'draft',
        view_count: 134,
        like_count: 7,
        comment_count: 0
      },
      {
        title: '播客内容策划与制作指南',
        content: '<h2>播客制作</h2><p>从策划到制作，全面介绍播客内容的创作流程。</p><p>声音的力量，传递思想与情感。</p>',
        status: 'draft',
        view_count: 112,
        like_count: 5,
        comment_count: 0
      },
      {
        title: '图文并茂的内容设计原则',
        content: '<h2>视觉设计</h2><p>如何通过图文结合创造更具吸引力的内容。</p><p>视觉化表达，提升内容传播效果。</p>',
        status: 'draft',
        view_count: 98,
        like_count: 4,
        comment_count: 0
      },
      {
        title: '内容数据分析与优化策略',
        content: '<h2>数据驱动优化</h2><p>通过数据分析优化内容策略，提升用户参与度。</p><p>让数据指导内容创作方向。</p>',
        status: 'draft',
        view_count: 76,
        like_count: 3,
        comment_count: 0
      }
    ];
    
    // 插入作品数据
    for (let i = 0; i < articles.length; i++) {
      const article = articles[i];
      const userId = userIds[i % userIds.length]; // 轮流分配给不同用户
      
      const articleResult = await pool.query(`
        INSERT INTO articles (user_id, title, content, content_html, status, view_count, like_count, comment_count, cover_image)
        VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9)
        RETURNING id, title
      `, [
        userId,
        article.title,
        JSON.stringify({ type: 'doc', content: [{ type: 'paragraph', content: [{ type: 'text', text: article.content }] }] }),
        article.content,
        article.status,
        article.view_count,
        article.like_count,
        article.comment_count,
        `https://picsum.photos/400/300?random=${i + 1}`
      ]);
      
      if (articleResult.rows.length > 0) {
        console.log(`作品创建成功: ${articleResult.rows[0].title}`);
        
        // 为每篇作品创建一些评论
        const articleId = articleResult.rows[0].id;
        const commentCount = Math.floor(Math.random() * 5) + 1;
        
        for (let j = 0; j < commentCount; j++) {
          const commentUserId = userIds[Math.floor(Math.random() * userIds.length)];
          await pool.query(`
            INSERT INTO comments (article_id, user_id, content)
            VALUES ($1, $2, $3)
          `, [
            articleId,
            commentUserId,
            `这是第${j + 1}条评论，内容很精彩！`
          ]);
        }
        
        // 为每篇作品创建一些点赞记录
        const likeCount = Math.floor(Math.random() * 10) + 1;
        for (let k = 0; k < likeCount; k++) {
          const likeUserId = userIds[Math.floor(Math.random() * userIds.length)];
          try {
            await pool.query(`
              INSERT INTO likes (user_id, target_type, target_id)
              VALUES ($1, 'article', $2)
              ON CONFLICT (user_id, target_type, target_id) DO NOTHING
            `, [likeUserId, articleId]);
          } catch (error) {
            // 忽略重复点赞错误
          }
        }
      }
    }
    
    console.log('测试数据插入完成！');
    
  } catch (error) {
    console.error('插入测试数据失败:', error);
  }
}

// 运行初始化
if (require.main === module) {
  initDatabase();
}

module.exports = { initDatabase };